#ifndef FILE_H_
#define FILE_H_

#include "util/exceptions/IOException.h"
#include <string>
#include <stdio.h>

namespace util {

/*
 * Clase que encapsula FILE * para escribir o leer linea por linea.
 */
class File {
public:
	/*
	 * Constructor, crea un archivo.
	 */
	File(std::string fileName);
	/*
	 * Destructur, cierra el archivo.
	 */
	~File();
	/*
	 * Abre el archivo solo para lectura.
	 * Tira IOException en caso de no poder abrir el archivo.
	 */
	File* openFileReadOnly() throw (util::IOException);
	/*
	 * Abre el archivo para escritura solamente (append).
	 * Tira IOException en caso de no poder abrir el archivo.
	 */
	File* openFileWriteOnly() throw (util::IOException);
	/*
	 * Se fija si el archivo ya fue abierto.
	 */
	bool isOpen();
	/*
	 * Lee la siguiente linea del archivo. Devuelve "" en caso de llegar a EOF.
	 * Tira IOException en caso de no poder leer.
	 */
	std::string readLine() throw (util::IOException);
	/*
	 * Escribe al final del archivo.
	 * Tira IOException en caso de no poder escribir.
	 */
	File* appendLine(std::string line) throw (util::IOException);
	/*
	 * Chequea si se llego al final del archivo.
	 */
	bool endOfFile();
	/*
	 * Devuelve el numero de linea dentro del archivo que se esta leyendo.
	 * Devuelve -1 en caso de no estar abierto el archivo.
	 */
	int getCurrentLineNumber();
	/*
	 * Devuelve el nombre del archivo.
	 */
	std::string getFileName();
	/*
	 * Arma un mensaje de error indicando la posicion donde se encontraba el dato
	 * conflictivo.
	 */
	std::string buildErrorMessage();
private:
	FILE * file;
	std::string fileName;
	std::string method;
	std::string currentLine;
	int line;
	int col;
	void openFile(std::string method) throw (util::IOException);
};
}

#endif /* FILE_H_ */
